package com.tianxia120.website.data.config;

import com.jfinal.json.Json;
import com.jfinal.render.ErrorRender;
import com.jfinal.render.RenderException;
import com.tianxia120.website.data.utils.ResultUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @createTime: 2018/10/26 16:55
 * @author: HingLo
 * @description: 自定义的框架级别异常处理器(400, 401, 404, 403, 500)错误等
 */
public class ErrorRenderFactory extends ErrorRender {

    /**
     * 返回json格式数据类型
     */
    private static final String JSON_CONTENT_TYPE = "application/json; charset=" + getEncoding();

    ErrorRenderFactory(int errorCode, String view) {
        super(errorCode, view);
    }

    @Override
    public void render() {
        // 如果是跨域请求,遇到框架错误就直接返回json格式的数据
        if (isAjax(request)) {
            PrintWriter writer;
            try {
                response.setStatus(200);
                response.setContentType(JSON_CONTENT_TYPE);
                writer = response.getWriter();
                writer.write(getErrorJson());
                writer.flush();
            } catch (IOException e) {
                throw new RenderException(e);
            }
        } else {
            // 如果想使用默认的或者config中配置的页面,直接调用父类的render就好
            super.render();
        }
    }


    /**
     * 判断是否是Ajax请求
     *
     * @param request request
     * @return Boolean值
     */
    private boolean isAjax(HttpServletRequest request) {
        return "XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With"));
    }

    /***
     * 定义制定错误码返回的json格式的数据返回
     * @return 自定义的json返回
     */
    private String getErrorJson() {
        Json json = Json.getJson();
        int errorCode = getErrorCode();
        switch (errorCode) {
            case 400:
                return json.toJson(ResultUtils.error(errorCode, "请求参数不正确,请检查后再试"));
            case 401:
                return json.toJson(ResultUtils.error(errorCode, "服务器拒绝你了你的请求,请联系管理员"));
            case 403:
                return json.toJson(ResultUtils.error(errorCode, "对不起,你没有权限访问该资源"));
            case 404:
                return json.toJson(ResultUtils.error(errorCode, "你访问的URL不正确,请检查后再试"));
            case 500:
                return json.toJson(ResultUtils.error(errorCode, "服务器错误,请稍后重试"));
            default:
                return json.toJson(ResultUtils.error(errorCode, "请求错误,请联系管理员"));
        }
    }


}
